package init

import (
	"log"
	"os"
	"path/filepath"
	"strings"
	"time"
)

// StartExportFileCleaner 启动导出文件清理器
func StartExportFileCleaner() {
	// 每天凌晨2点执行一次清理任务
	ticker := time.NewTicker(24 * time.Hour)
	defer ticker.Stop()

	// 立即执行一次清理任务（服务启动时）
	go cleanExportFiles()

	for {
		select {
		case <-ticker.C:
			go cleanExportFiles()
		}
	}
}

// cleanExportFiles 清理过期的导出文件
func cleanExportFiles() {
	log.Println("开始清理过期的导出文件...")

	// 获取过期时间
	expiryTime := GetExportExpiryTime()

	exportDir := ExportConfig.ExportDir

	// 检查导出目录是否存在
	if _, err := os.Stat(exportDir); os.IsNotExist(err) {
		log.Printf("导出目录不存在，跳过清理: %s", exportDir)
		return
	}

	// 统计清理信息
	var totalFiles int
	var deletedFiles int
	var totalSize int64
	var deletedSize int64

	// 遍历导出目录
	err := filepath.Walk(exportDir, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			log.Printf("访问文件失败: %v", err)
			return filepath.SkipDir
		}

		// 只处理文件，跳过目录
		if !info.IsDir() {
			totalFiles++
			totalSize += info.Size()
			
			// 检查文件是否过期（支持CSV和Excel文件）
			if strings.HasSuffix(info.Name(), ".csv") || strings.HasSuffix(info.Name(), ".xlsx") {
				// 检查文件是否过期
				if info.ModTime().Before(expiryTime) {
					// 删除过期文件
					if err := os.Remove(path); err != nil {
						log.Printf("删除过期文件失败: %s, 错误: %v", path, err)
					} else {
						log.Printf("成功删除过期文件: %s (大小: %d bytes)", path, info.Size())
						deletedFiles++
						deletedSize += info.Size()
					}
				}
			}
		}
		return nil
	})

	if err != nil {
		log.Printf("清理导出文件时出错: %v", err)
	}

	// 清理空目录
	cleanEmptyDirectories()

	// 记录清理统计信息
	log.Printf("导出文件清理完成 - 总文件数: %d, 删除文件数: %d, 总大小: %d bytes, 释放空间: %d bytes", 
		totalFiles, deletedFiles, totalSize, deletedSize)

	log.Println("导出文件清理任务完成")
}

// cleanEmptyDirectories 清理空目录
func cleanEmptyDirectories() {
	exportDir := ExportConfig.ExportDir
	if exportDir == "" {
		return
	}
	
	var deletedDirs []string
	
	// 从最深层开始清理空目录
	for {
		var foundEmpty bool
		
		err := filepath.Walk(exportDir, func(path string, info os.FileInfo, err error) error {
			if err != nil {
				return nil
			}
			
			// 跳过根目录
			if path == exportDir {
				return nil
			}
			
			// 只处理目录
			if !info.IsDir() {
				return nil
			}
			
			// 检查目录是否为空
			entries, err := os.ReadDir(path)
			if err != nil {
				return nil
			}
			
			if len(entries) == 0 {
				log.Printf("删除空目录: %s", path)
				if err := os.Remove(path); err != nil {
					log.Printf("删除空目录失败: %s, 错误: %v", path, err)
				} else {
					deletedDirs = append(deletedDirs, path)
					foundEmpty = true
				}
			}
			
			return nil
		})
		
		if err != nil {
			log.Printf("清理空目录时发生错误: %v", err)
			break
		}
		
		// 如果没有找到空目录，退出循环
		if !foundEmpty {
			break
		}
	}
	
	if len(deletedDirs) > 0 {
		log.Printf("空目录清理完成，删除了 %d 个空目录", len(deletedDirs))
	}
}

// CleanTaskFiles 清理指定任务的文件
func CleanTaskFiles(taskID string) error {
	exportDir := ExportConfig.ExportDir
	if exportDir == "" {
		return nil
	}
	
	var deletedFiles []string
	
	// 遍历导出目录，查找与任务ID相关的文件
	err := filepath.Walk(exportDir, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			return nil
		}
		
		// 跳过目录
		if info.IsDir() {
			return nil
		}
		
		// 检查文件名是否包含任务ID
		fileName := info.Name()
		if strings.Contains(fileName, taskID) {
			log.Printf("删除任务文件: %s", path)
			if err := os.Remove(path); err != nil {
				log.Printf("删除任务文件失败: %s, 错误: %v", path, err)
			} else {
				deletedFiles = append(deletedFiles, path)
			}
		}
		
		return nil
	})
	
	if err != nil {
		log.Printf("清理任务文件时发生错误: %v", err)
	}
	
	log.Printf("任务 %s 的文件清理完成，删除了 %d 个文件", taskID, len(deletedFiles))
	return err
}

// GetExportFileInfo 获取导出文件信息
func GetExportFileInfo() (int, int64, error) {
	exportDir := ExportConfig.ExportDir
	if exportDir == "" {
		return 0, 0, nil
	}
	
	var fileCount int
	var totalSize int64
	
	err := filepath.Walk(exportDir, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			return nil
		}
		
		// 跳过目录
		if info.IsDir() {
			return nil
		}
		
		fileCount++
		totalSize += info.Size()
		
		return nil
	})
	
	return fileCount, totalSize, err
}
